import * as path from 'path'
import { defineConfig, loadEnv, PluginOption } from 'vite'
import react from '@vitejs/plugin-react'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'

import viteCompression from 'vite-plugin-compression'
import { viteMockServe } from 'vite-plugin-mock'
import ViteCDNPlugin from 'vite-plugin-cdn-import'

import { visualizer } from 'rollup-plugin-visualizer'

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  const root = process.cwd()

  const env = loadEnv(mode, root)
  const { VITE_APP_PORT, VITE_APP_MOCK } = env

  const isBuild = command === 'build'

  // vite 插件
  const vitePlugins: (PluginOption | PluginOption[])[] = [
    react(),
    // vite-plugin-svg-icons
    createSvgIconsPlugin({
      // Specify the icon folder to be cached
      iconDirs: [path.resolve(__dirname, './src/assets/iconsvg')],
      // Specify symbolId format
      symbolId: 'icon-[name]',
    }),
    ViteCDNPlugin({
      modules: [
        // {
        //   name: 'react',
        //   var: 'React',
        //   path: 'https://cdn.jsdelivr.net/npm/react@18.2.0/umd/react.production.min.js',
        // },
        // {
        //   name: 'react-dom',
        //   var: 'ReactDOM',
        //   path: 'https://cdn.jsdelivr.net/npm/react-dom@18.2.0/umd/react-dom.production.min.js',
        // },
        // {
        //   name: 'lodash',
        //   var: '_',
        //   path: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js',
        // },
        // {
        //   name: 'echarts',
        //   var: 'echarts',
        //   path: 'https://cdn.jsdelivr.net/npm/echarts@5.3.3/dist/echarts.min.js',
        // },
      ],
    }),
    // 优化加载速度，需要对应Nginx配置 ----- vite-plugin-compression
    viteCompression({
      verbose: true, // 是否在控制台输出压缩结果
      disable: false, // 是否禁用,相当于开关在这里
      threshold: 10240, // 体积大于 threshold 才会被压缩,单位 b，1b=8B, 1B=1024KB  那我们这里相当于 9kb多吧，就会压缩
      algorithm: 'gzip', // 压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
      ext: '.gz', // 文件后缀
    }),
    // 打包文件分析 -----  rollup-plugin-visualizer
    // visualizer({
    //   open: true, // 注意这里要设置为true，否则无效
    //   gzipSize: true, // 分析图生成的文件名
    //   brotliSize: true, // 收集 brotli 大小并将其显示
    //   filename: 'stats.html', // 分析图生成的文件名
    // }) as PluginOption,
  ]
  // vite-plugin-mock
  if (VITE_APP_MOCK === 'true') {
    vitePlugins.push(
      viteMockServe({
        mockPath: 'mock',
        supportTs: true,
        watchFiles: true,
        localEnabled: !isBuild,
        prodEnabled: isBuild,
        logger: true,
      }),
    )
  }
  // bbj ip  http://192.168.120.121:9005/api
  return {
    root,
    server: {
      host: true,
      port: Number(VITE_APP_PORT || 3000),

      proxy: {
        '/api': {
          // 用于开发环境下的转发请求
          // 更多请参考：https://vitejs.dev/config/#server-proxy
          // target: 'https://vitejs.dev/config/#server-proxy',
          // zdb本地
          // target: 'http://192.168.120.146:9005',
          target: 'http://192.168.120.148:8012',
          // 八级本地
          // target: 'http://192.168.120.123:9005',
          // zkj本地
          // target: 'http://192.168.120.113:9005',
          // 刘青本地
          // target: 'http://192.168.120.102:9005',
          changeOrigin: true,
        },
      },
    },
    resolve: {
      alias: [
        {
          find: /^~/,
          replacement: `${path.resolve(__dirname, './node_modules')}/`,
        },
        {
          find: /@\//,
          replacement: `${path.resolve(__dirname, './src')}/`,
        },
      ],
    },
    plugins: vitePlugins,
    css: {
      preprocessorOptions: {
        less: {
          javascriptEnabled: true,
        },
      },
    },
    build: {
      // 官网都有  具体自己去看
      outDir: 'dist',
      // 启用 CSS 代码拆分
      cssCodeSplit: true,
      minify: 'terser',
      // 打包配置 -- 代码分割
      rollupOptions: {
        output: {
          // 静态资源打包做处理
          chunkFileNames: 'static/js/[name]-[hash].js',
          entryFileNames: 'static/js/[name]-[hash].js',
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
          manualChunks(id) {
            if (id.includes('@js-preview/docx')) {
              return 'preview-docx'
            }
            if (id.includes('@js-preview/excel')) {
              return 'preview-excel'
            }
            if (id.includes('@js-preview/pdf')) {
              return 'preview-pdf'
            }
          },
        },
      },

      terserOptions: {
        // 清除console和debugger
        compress: {
          drop_console: true,
          drop_debugger: true,
        },
      },
    },
  }
})
